/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Forte for Java, Community Edition. The Initial * Developer of the Original Code is Sun Microsystems, Inc. Portions * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. */ package org.netbeans.beaninfo.editors; import java.awt.*; import java.beans.*; import java.util.ResourceBundle; import org.openide.util.NbBundle; import javax.swing.table.*; /** A property editor for array of Strings. * @author Ian Formanek * @version 0.10, 17 Jun 1998 */ public class TableModelEditor extends Object implements PropertyEditor { // the bundle to use static ResourceBundle bundle = NbBundle.getBundle ( TableModelEditor.class); public TableModelEditor() { support = new PropertyChangeSupport (this); } public Object getValue () { return table; } public void setValue (Object value) { table = new NbTableModel ((TableModel) value); support.firePropertyChange ("", null, null); // NOI18N } public String getAsText () { return null; } public void setAsText (String string) { } public String getJavaInitializationString () { TableModel m = (TableModel) getValue (); StringBuffer titlesSB = new StringBuffer (); int i = m.getColumnCount (); int j = m.getRowCount (); titlesSB.append ("{\n\t\t"); // NOI18N if (i > 0) { String s = m.getColumnName (0); titlesSB.append ("\"").append (s != null ? s : "").append ('"'); // NOI18N for (int k = 1; k < i; k++) { String s1 = m.getColumnName (k); titlesSB.append (", \"").append (s1 != null ? s1 : "").append ('"'); // NOI18N } } titlesSB.append ("\n\t}"); // NOI18N boolean generateTypes = false; StringBuffer typesSB = new StringBuffer (); typesSB.append ("{\n\t\t"); // NOI18N if (i > 0) { typesSB.append (m.getColumnClass (0).getName ()).append (".class"); // NOI18N if (m.getColumnClass (0) != String.class) generateTypes = true; for (int k = 1; k < i; k++) { if (m.getColumnClass (k) != String.class) generateTypes = true; typesSB.append (", ").append (m.getColumnClass (k).getName ()).append (".class"); // NOI18N } } typesSB.append ("\n\t}"); // NOI18N boolean generateEditable = false; StringBuffer editableSB = new StringBuffer (); editableSB.append ("{\n\t\t"); // NOI18N if (i > 0) { editableSB.append (m.isCellEditable (0, 0)); if (!m.isCellEditable (0, 0)) generateEditable = true; for (int k = 1; k < i; k++) { if (!m.isCellEditable (0, k)) generateEditable = true; editableSB.append (", ").append (m.isCellEditable (0, k)); // NOI18N } } editableSB.append ("\n\t}"); // NOI18N StringBuffer dataSB = new StringBuffer (); dataSB.append ("{\n\t\t"); // NOI18N if (j > 0) { for (int l = 0; l < j; l++) { if (l != 0) dataSB.append (",\n\t\t"); // NOI18N if (i == 0) { dataSB.append ("{}"); // NOI18N } else { Object obj = m.getValueAt (l, 0); dataSB.append ('{').append (getAsString (obj)); for (int i1 = 1; i1 < i; i1++) { obj = m.getValueAt (l, i1); dataSB.append (", ").append (getAsString (obj)); // NOI18N } dataSB.append ('}'); } } } dataSB.append ("\n\t}"); // NOI18N if (generateEditable || generateTypes) { return "new javax.swing.table.DefaultTableModel (\n" + // NOI18N "\tnew Object [][] " + new String (dataSB) + ",\n" + // NOI18N "\tnew String [] " + new String (titlesSB) + "\n" + // NOI18N ") {\n" + // NOI18N (generateTypes ? ( "\tClass[] types = new Class [] " + new String (typesSB) + ";\n") : // NOI18N "") + // NOI18N (generateEditable ? ( "\tboolean[] canEdit = new boolean [] " + new String (editableSB) + ";\n") : // NOI18N "") + // NOI18N (generateTypes ? ( "\n" + // NOI18N "\tpublic Class getColumnClass (int columnIndex) {\n" + // NOI18N "\t\treturn types [columnIndex];\n" + // NOI18N "\t}\n") : // NOI18N "") + // NOI18N (generateEditable ? ( "\n" + // NOI18N "\tpublic boolean isCellEditable (int rowIndex, int columnIndex) {\n" + // NOI18N "\t\treturn canEdit [columnIndex];\n" + // NOI18N "\t}\n") : // NOI18N "") + // NOI18N "}"; // NOI18N } else { return "new javax.swing.table.DefaultTableModel (\n" + // NOI18N "\tnew Object [][] " + new String (dataSB) + ",\n" + // NOI18N "\tnew String [] " + new String (titlesSB) + "\n" + // NOI18N ")"; // NOI18N } } public String[] getTags () { return null; } public boolean isPaintable () { return false; } public void paintValue (Graphics g, Rectangle rectangle) { } public boolean supportsCustomEditor () { return true; } public Component getCustomEditor () { return new CustomTableModelEditor (this); } public void addPropertyChangeListener (PropertyChangeListener propertyChangeListener) { support.addPropertyChangeListener (propertyChangeListener); } public void removePropertyChangeListener (PropertyChangeListener propertyChangeListener) { support.removePropertyChangeListener (propertyChangeListener); } static String getAsString (Object o) { if (o == null) return "null"; // NOI18N if (o instanceof String) if (o == null) return "\"\""; // NOI18N else return "\"" + o + "\""; // NOI18N String s = o.getClass ().getName (); int g = s.lastIndexOf ('.'); if (g >= 0) s = s.substring (g + 1, s.length ()); return "new " + s + " (" + o + ")"; // NOI18N } static Object getDefaultValue (Class c) { return null; } // ----------------------------------------------------------------------------- // NbTableModel public static class NbTableModel extends AbstractTableModel implements java.io.Externalizable { /** generated Serialized Version UID */ static final long serialVersionUID = -6843008677521167210L; Object data[][]; String titles[]; Class types[]; boolean editable[]; transient boolean alwaysEditable = false; /** For externalization only */ public NbTableModel () { } public NbTableModel (String[] titles, Class[] types, boolean[] editable) { this.titles = titles; this.types = types; this.editable = editable; data = new Object [titles.length][4]; } public NbTableModel (TableModel createFrom) { if (createFrom == null) { data = new Object[4][4]; titles = new String[] { bundle.getString ("CTL_Title") + " 1", bundle.getString ("CTL_Title") + " 2", bundle.getString ("CTL_Title") + " 3", bundle.getString ("CTL_Title") + " 4", }; types = new Class[] { String.class, String.class, String.class, String.class }; editable = new boolean [] { true, true, true, true }; } else { int columns = createFrom.getColumnCount (); int rows = createFrom.getRowCount (); data = new Object [rows][columns]; titles = new String [columns]; types = new Class [columns]; editable = new boolean [columns]; for (int i = 0; i < columns; i++) { titles [i] = createFrom.getColumnName (i); types [i] = createFrom.getColumnClass (i); if (createFrom instanceof NbTableModel) editable [i] = ((NbTableModel)createFrom).editable[i]; else editable [i] = true; for (int j = 0; j < rows; j++) { data[j][i] = createFrom.getValueAt (j, i); } } } } public Class getColumnClass (int i) { return types [i]; } public String getColumnName (int i) { return titles[i]; } public int getRowCount () { return data.length; } public int getColumnCount () { return titles.length; } public boolean isCellEditable (int i, int j) { return alwaysEditable || editable [j]; } public Object getValueAt (int row, int column) { return data [row][column]; } public void setValueAt (Object obj, int row, int column) { data[row][column] = obj; fireTableCellUpdated (row, column); } void setRowCount (int newRowCount) { int col = getColumnCount (); int row = getRowCount (); if (newRowCount > row) { Object[][] newData = new Object [newRowCount][col]; System.arraycopy (data, 0, newData, 0, row); int i; for (i = row; i < newRowCount; i++) newData [i] = new Object [col]; data = newData; fireTableRowsInserted (row, newRowCount - 1); return; } if (newRowCount > 0) { Object[][] newData = new Object [newRowCount][col]; System.arraycopy (data, 0, newData, 0, newRowCount); int i1 = data.length; data = newData; fireTableRowsDeleted (newRowCount, i1 - 1); } } void setColumnCount (int newColumnCount) { int col = getColumnCount (); int row = getRowCount (); int min = Math.min (newColumnCount, col); for (int i = 0; i < row; i++) { Object[] line = new Object [newColumnCount]; System.arraycopy (data [i], 0, line, 0, min); data [i] = line; } String[] newTitles = new String [newColumnCount]; System.arraycopy (titles, 0, newTitles, 0, min); for (int i = min; i < newColumnCount; i ++) newTitles [i] = bundle.getString ("CTL_Title") + " " + (i + 1); titles = newTitles; Class[] newTypes = new Class [newColumnCount]; System.arraycopy (types, 0, newTypes, 0, min); for (int i = min; i < newColumnCount; i ++) newTypes [i] = Object.class; types = newTypes; boolean[] newEditable = new boolean [newColumnCount]; System.arraycopy (editable, 0, newEditable, 0, min); for (int i = min; i < newColumnCount; i ++) newEditable [i] = true; editable = newEditable; fireTableStructureChanged (); } void fireTableChanged () { fireTableStructureChanged (); } public void writeExternal (java.io.ObjectOutput oo) throws java.io.IOException { int rowCount = data.length; int columnCount = types.length; // row count oo.writeInt (rowCount); // column count oo.writeInt (columnCount); oo.writeObject (titles); oo.writeObject (editable); for (int i = 0; i < columnCount; i++) { oo.writeObject (types[i].getName ()); } for (int row = 0; row < rowCount; row++) { for (int column = 0; column < columnCount; column++) { if (data[row][column] instanceof java.io.Serializable) oo.writeObject (data[row][column]); else oo.writeObject (null); } } } public void readExternal (java.io.ObjectInput oi) throws java.io.IOException, ClassNotFoundException { int rowCount = oi.readInt (); int columnCount = oi.readInt (); titles = (String[]) oi.readObject (); editable = (boolean[]) oi.readObject (); types = new Class [columnCount]; for (int i = 0; i < columnCount; i++) { try { types[i] = Class.forName ((String)oi.readObject ()); } catch (ClassNotFoundException e) { types[i] = Object.class; } } data = new Object[rowCount][columnCount]; for (int row = 0; row < rowCount; row++) { for (int column = 0; column < columnCount; column++) { data[row][column] = oi.readObject (); } } } } // Class NbTableModel // ----------------------------------------------------------------------------- // private variables private NbTableModel table; private PropertyChangeSupport support; } /* * Log * 6 Gandalf 1.5 1/13/00 Petr Jiricka i18n * 5 Gandalf 1.4 12/17/99 Pavel Buzek #4196 * 4 Gandalf 1.3 10/22/99 Ian Formanek NO SEMANTIC CHANGE - Sun * Microsystems Copyright in File Comment * 3 Gandalf 1.2 6/8/99 Ian Formanek ---- Package Change To * org.openide ---- * 2 Gandalf 1.1 3/4/99 Jan Jancura bundle moved * 1 Gandalf 1.0 1/5/99 Ian Formanek * $ */